/**********************************************
 * Cours :			 LOG120
 * Session :		 Automne 2011
 * Groupe : 		 03
 * Projet : 		 Lab 1
 * Étudiant(e)(s) : Garcia Carrasco, Maria
 * 					 Bolduc, Andrew
 * Code(s) perm. :   GARM05559006
 * 					 BOLA03098701
 * Professeur : 	 Yannick Boucher
 * Chargé de labo:  Jonathan Simard
 * Nom du fichier :  ShapeNode.java
 * Date crée :      2011-10-22
 **********************************************
 * Historique des modifications
 **********************************************
 * 2011-10-22		Version initiale
 **********************************************
 *
 *
 *
 * @author Maria Garcia Carrasco et Andrew Bolduc
 * Cette classe est un Node qui prend comme paramètres
 * un objet de type Shape et un autre Node. Cette
 * classe sera utilisé pour la conception d'une liste chainée.
 */

package nodes;

import interfaces.IShape;
import shapes.AbstractShape;

public class ShapeNode implements Cloneable {

	private IShape data;
    private IShape original;
	private ShapeNode next;
	private ShapeNode previous;
	
	/**
	 * Constructor.
	 * @param shape The AbstractShape to be stored in the Node.
	 * @param next The reference to the successor Node.
	 * @param previous The reference to the predecessor Node.
	 */
	public ShapeNode(IShape shape, ShapeNode next, ShapeNode prev) {
		this.data = shape;
		this.next = next;
		this.previous = prev;
	}
	
	/**
	 * Constructor.
	 * @param shape The AbstractShape to be stored in the Node.
	 */
	public ShapeNode(AbstractShape shape) {
		this.data = shape;
	}
	
	/**
	 * Méthode qui retourne l'objet dans le node: AbstractShape
	 * @return data The AbstractShape that is stored in the Node.
	 */
	public IShape getData() {
		return data;
	}

	/**
	 * Méthode que peut changer l'objet dans le Node
	 * @param data The AbstractShape that is stored in the Node.
	 */
	public void setData(IShape data) {
		this.data = data;
	}
    
    /**
	 * Méthode qui retourne l'objet dans le node: AbstractShape
	 * @return data The AbstractShape that is stored in the Node.
	 */
	public IShape getOriginal() {
		return original;
	}
    
	/**
	 * Méthode que peut changer l'objet dans le Node
	 * @param data The AbstractShape that is stored in the Node.
	 */
	public void setOriginal(AbstractShape original) {
		this.original = original;
	}

	/**
	 * Méthode pour appeler le prochain Node
	 * @return next The reference to the successor Node.
	 */
	public ShapeNode getNext() {
		return next;
	}

	/**
	 * Méthode que peut changer l'objet dans le prochain node
	 * @param next The reference to the successor Node.
	 */
	public void setNext(ShapeNode next) {
		this.next = next;
	}
	
	/**
	 * Méthode pour appeler le node précédent
	 * @return previous The reference to the predecessor Node.
	 */
	public ShapeNode getPrevious() {
		return previous;
	}


	/**
	 * Méthode que peut changer le node précédent
	 * @param previous The reference to the predecessor Node.
	 */
	public void setPrevious(ShapeNode previous) {
		this.previous = previous;
	}
    
    protected Object clone() throws CloneNotSupportedException {
        ShapeNode clone = (ShapeNode)super.clone();
        return clone;
    }
	
}